iT邦幫忙

0

Combine-Dropping values 的用法

  • 分享至 

  • xImage
  •  

Dropping values 主要用途是將特定的值丟掉,丟掉的條件有以下三種用法。

dropFirst

dropFirst 裡面可以帶一個 interger的參數,來決定 publisher 發出來的元素從地一個開始數地幾個。

    publisher
      .dropFirst(2)
      .sink(receiveValue: { print($0) })
      .store(in: &subscriptions)

interger可以不帶參數,那麼就是預設的只drop 第一個元素。

    publisher
      .dropFirst()
      .sink(receiveValue: { print($0) })
      .store(in: &subscriptions)

關於 dropFirst 事實上在 Sequence 裡面有一個類似的方法,而概念是一樣的,也就是 drop 指定數量的元素。可以看這個延伸閱讀

drop(while:)

裡面帶一個 closure,這個 closure 返回一個 Bool,當這個 Bool 為true 之前,前面的元素通通drop。反之則保留。

  publisher
    .drop(while: {
      return $0 % 5 != 0
    })
    .sink(receiveValue: { print($0) })
    .store(in: &subscriptions)

可以注意的是,你可能會認為這個跟 filter 很像。但是他們其實是完全不一樣的東西。
這個方法比較特殊,drop 的條件不是判斷當前 publisher拋出的元素,而是判斷另外一個 publisher的訊號。drop 只要通過了closure的驗證,後面就會全部通過。 而 filter 不一樣,每一個元素都需要通過closure的驗證。

drop(untilOutputFrom:)

let upstream = PassthroughSubject<Int,Never>()
let second = PassthroughSubject<String,Never>()
cancellable = upstream
    .drop(untilOutputFrom: second)
    .sink { print("\($0)", terminator: " ") }


upstream.send(1)
upstream.send(2)
second.send("A")
upstream.send(3)
upstream.send(4)

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言